package core

import (
	"fmt"
	"os"
	"os/signal"
)

// 系统信号绑定处理函数 一个信号可以有多个处理函数要处理
var handlers = make(map[os.Signal][]func(sig os.Signal))

// 绑定处理信号的函数
func SignalBindFunHandler(handler func(sig os.Signal), signals ...os.Signal) {
	for _, s := range signals {
		handlers[s] = append(handlers[s], handler)
	}
}

var SignalNotifyIsRuning = false

// 系统消息推送
func SignalNotify() {
	if SignalNotifyIsRuning && RunEnv == DevEnv {
		fmt.Println("SignalNotify 只能被执行一次")
		return
	}

	SignalNotifyIsRuning = true
	signalChan := make(chan os.Signal)

	var signals []os.Signal

	// 遍历出所有要处理的信号
	for sig, _ := range handlers {
		signals = append(signals, sig)
	}

	if len(signals) > 0 {
		// 信号推送
		signal.Notify(signalChan, signals...)
		go func() {
			for {
				s := <-signalChan
				if handlerFuns, ok := handlers[s]; ok {
					for _, handlerFun := range handlerFuns {
						handlerFun(s)
					}
				}
			}
		}()
	}
}
